La complessità computazione serve per stabilire il costo di un algoritmo in termini di numero di operazioni fatte in RAM e dalla memoria occupata durante la sua esecuzione. Quando andiamo parliamo di costo computazionale prendiamo in esame

  • il caso peggiore: ovvero il costo massimo tra tutti i possibili input
  • il caso medio: costo mediato tra tutte le istanze di input è importante per definire un costo totale di un algoritmo definire il costo unitario di ogni singola operazione, in questo modo contando le operazioni si riesce a definire il costo totale, inoltre è necessario definire il comportamento dell’algoritmo in caso di dimensioni dell’input che tendono ad infinito e questo lo facciamo attraverso la notazione asintotica. Le notazioni principali sono:
  • Grande O: denotiamo con O(g(n)) l’insieme delle funzioni esistono delle constanti positive tale che per ogni usando questa notazione facciamo riferimento ai casi peggiori ovvero ad un limite superiore per . Esistono diverse classe di equivalenza in cui i vari algoritmi in base alla loro complessità vengono raggruppate, le classi sono:
    • Costante: 1
    • Sotto-lineare:
    • Lineare:
    • Polinomiale:
    • Esponenziale: (quello peggiore)
  • Grande Beta:
  • Grande Theta:

Rielaborazione

Esistono due tipi di complessità:

  • complessità temporale
  • complessità spaziale di seguito parleremo solo di complessità temporale: la complessità di un’algoritmo varia in base a quello che quel algoritmo fa:
  • O(1): complessità constante
  • O(n): complessità di un ciclo quando le sue variabili sono incrementate/decrementate si una quantità costante.
  • O(n^c): c è il numero di cicli annidati in cui le variabili contatore sono incrementate/decrementate di una quantità constante
  • O(log n): complessità di un ciclo quando le sue variabili sono incrementate/decrementate moltiplicandole o dividendole per una costante.
  • O(log log n): complessità di un ciclo quando le sue variabili sono incrementate/decrementate esponenzialmente
Notazione asintotica

Le notazioni utilizzate vengono dette asintotiche perché studiano la complessità computazionale al tendere n (numeri di dati in input) all’infinito e sono 3:

  • Notazione big O: che definisce il limite asintotico superiore ovvero il caso peggiore al tendere di all’infinito.
  • Notazione Omega: che definisce il limite asintotico inferiore ovvero il caso migliore al tendere di all’infinito.
  • Notazione Theta: che definisce il limite asintotico stretto ovvero una condizione più stringente alla notazione big O infatti per definire questa notazione le notazioni O e Omega devono corrispondere
Ricerca lineare

Prendendo in esame la ricerca lineare in un array di elementi possiamo dire che:

  • Caso migliore: (notazione big O)
  • Caso peggiore: (notazione big Beta)
  • Caso medio: ? Per riuscire a calcolare il caso medio abbiamo bisogno della funzione che ritorna la probabilità che uno specifico elemento si trovi nella posizione passata, se ogni elemento è equiprobabile, allora la funzione diventa: , e quindi per il calcolo del valore atteso: ovvero: da questo deduciamo che il caso medio é: